package com.honey.compilation.sql.ddl;

import java.util.ArrayList;
import java.util.List;

import com.honey.compilation.sql.SqlColumn;
import com.honey.compilation.sql.SqlKeyWord;
import com.honey.compilation.sql.SqlScript;
import com.honey.compilation.sql.SqlTable;
import com.honey.core.builder.CharacterBuilder;
import com.honey.core.builder.CharacterBuilderFactory;
import com.honey.core.compiler.CompilationException;
import com.honey.core.compiler.IndentSpace;
import com.honey.core.utils.StringUtility;

/**
 * 创建索引
 * @author Administrator
 *
 */
@Deprecated
public class CreateIndex extends  Create implements SqlScript {

	/** 索引类型 */
	private IndexType indexType;

	/**索引列 */
	private List<String> columns ;

	/** 数据库表 */
	private SqlTable table; 

	/**
	 * 构造函数
	 * @param tableName 数据库表名称
	 */
	public CreateIndex(String tableName){
		this.table = new SqlTable(tableName);
		columns = new ArrayList<String>();
	}
	
	/**
	 * 构造函数
	 * @param table 数据库表对象
	 */
	public CreateIndex(SqlTable table){
		this.table= table;
		columns = new ArrayList<String>();
	}
	
	
	/**
	 * 构造函数
	 * @param schema 数据库结构
	 * @param tableName 表名称
	 */
	public CreateIndex(String schema, String tableName){
		this.table = new SqlTable(schema,tableName);
		columns = new ArrayList<String>();
	}

	/**
	 * 构造函数
	 * @param tableName 数据库名称
	 * @param columns 索引列
	 */
	public CreateIndex(String tableName,SqlColumn  ...columns){
		this(tableName);
		addColumn(columns);
	}
	
	/**
	 * 添加索引列
	 * @param columns 索引列
	 */
	public void addColumn(String ...columns){
		for(String column : columns)
			if(StringUtility.stringHasValue(column))this.columns.add(column);
	}
	
	/**
	 * 添加索引列
	 * @param columns 索引列
	 */
	public void addColumn(SqlColumn ...columns){
		for(SqlColumn column : columns)
			if(column != null)this.columns.add(column.getName().getValue());
	}
	
	/**
	 * 获取数据库schema
	 * @return
	 */
	public String getSchema() {
		return table.getSchema();
	}
	
	/**
	 * 获取数据名称
	 * @return
	 */
	public String getTableName() {
		return table.getTableName();
	}

	/**
	 * 设定数据库schema
	 * @param schema
	 */
	public void setSchema(String schema) {
		table.setSchema(schema);
	}

	/**
	 * 获取索引类型
	 * @return
	 */
	public IndexType getIndexType() {
		return indexType;
	}
	
	/**
	 * 设定索引类型
	 * @param indexType
	 */
	public void setIndexType(IndexType indexType) {
		this.indexType = indexType;
	}
	
	/*
	 * (non-Javadoc)
	 * @see com.honey.core.dom.sql.ddl.Create#compiledContent(int)
	 */
	@Override
	public CharacterBuilder compiledContent(int indentLevel) throws CompilationException {
		CharacterBuilder answer = CharacterBuilderFactory.createC16StringBuilder();
		if( ! StringUtility.stringHasValue(this.getTableName() ) )
			throw new CompilationException("没有tablename");
		
		boolean newLine = false;
		for(String column : columns ){
			if (newLine)IndentSpace.newLine(answer);else newLine = true;
			
			answer.append( super.compiledContent( indentLevel ) ); 
//			if(indexType == IndexType.FULLTEXT){
//				answer.append( IndexType.FULLTEXT );
//			}else if(indexType == IndexType.UNIQUE){
//				answer.append( IndexType.UNIQUE );
//			}
			switch( indexType ){
				case FULLTEXT:
					answer.append( IndexType.FULLTEXT );
					break;
				case UNIQUE:
					answer.append( IndexType.UNIQUE );
					break;
			}
			
			answer.append( SqlKeyWord.INDEX )
			.append( column ).append(SqlKeyWord.OPERATION_SPACE)
			.append( SqlKeyWord.ON)
			.append(table.compiledContent(0))
			.append( SqlKeyWord.OPERATION_PAREN_LEFT )
			.append( column )
			.append( SqlKeyWord.OPERATION_PAREN_RIGHT )
			.append(SqlKeyWord.OPERATION_SEMICOLON);
			
		}
		return answer;
	}
	
	/**
	 * 索引类型
	 * @author Administrator
	 *
	 */
	public enum IndexType{
		
		/**
		 * 默认
		 */
		NORMAL("Normal"),
		
		/**
		 * 唯一索引
		 */
		UNIQUE("UNIQUE"),
		
		/**
		 * 全文检索索引
		 */
		FULLTEXT("FULLTEXT"),
		
		;
		
		private final String name ;
		
		/**
		 * 构造函数
		 * @param name
		 */
		private IndexType(String name){
			this.name =  name;
		}
		
		/**
		 * 获取索引名称
		 * @return
		 */
		public String getName() {
			return name;
		}
		
		/*
		 * (non-Javadoc)
		 * @see java.lang.Enum#toString()
		 */
		@Override
		public String toString() {
			return name + SqlKeyWord.OPERATION_SPACE ;
		}
	}
}
